#include "sql_list.h"



Sql_list * Init_Sql_List(void)
{
    // 创建数据关系 的空间
    Sql_list * L = (Sql_list *)malloc(sizeof(Sql_list));
    if (NULL == L)
    {
        printf("动态顺序表创建失败");
        return NULL;
    }
    // 创建数据 的空间
    L->max = 5;
    L->data = (Elenemt_data *)malloc(L->max * sizeof(Elenemt_data));
    if (NULL == L->data)
    {
        printf("数据空间创建失败\n");
        return NULL;
    }
    // 长度初始化
    L->len = 0;
    return L;
}

//顺序表的扩容：
int Expand_Sql_List( Sql_list * L , int size )
{
    // 1、安全判断
    if (NULL == L)
    {
        printf("这片空间不能存在\n");
        return EOF;
    }
    if (size < L->len)
    {
        printf("创建的空间太小了\n");
        return EOF;
    }
    // 2、创建新空间
    Elenemt_data * data = NULL;
    data = (Elenemt_data * )malloc(size * sizeof(Elenemt_data));
    if (NULL == L->data)
    {
        printf("数据空间创建失败\n");
        return EOF;
    }
    // 3、数据拷贝
    for (int i = 0; i < L->len; i++)
    {
        data[i] = L->data[i];
    }
    
    // 4、更新
    L->max = size;
    
    // 5、销毁原数据
    free(L->data);
    
    // 6、改写新空间地址
    L->data = data;

}

// 顺序表的尾插
int tail_insert_tail(Sql_list * L , Elenemt_data data)
{
    // 1、安全判断
    if (NULL == L)
    {
        printf("表空间不存在\n");
        return EOF;
    }
    if (NULL == L->data)
    {
        printf("数据空间不存在\n");
        return EOF;
    }
    if (L->len >= L->max)
    {
        printf("数据空间满了不能存\n");
        return EOF;
    }
    
    // 2、插入数据
    L->data[L->len++] = data;

    return 0;
}

// 按位置插入
// 链表和顺序表的区别
// 链表方便 删 增
// 顺序表方便 查 改
int pos_insert_list(Sql_list * L , int index , Elenemt_data data)
{
    // 1、安全判断
    if (NULL == L)
    {
        printf("表空间不存在\n");
        return EOF;
    }
    if (NULL == L->data)
    {
        printf("数据空间不存在\n");
        return EOF;
    }
    if (L->len >= L->max)
    {
        printf("数据空间满了不能存\n");
        return EOF;
    }
    if (index >= L->len || index < 0)
    {
        printf("index 参数错误\n");
        return EOF;
    }

    // 循环移动
    for (int i = L->len - 1; i > index - 1 ; i--)
    {
        L->data[i + 1] = L->data[i];
        // printf("开始移动L->data[%d] ->>  L->data[%d]\n" , i , i + 1);
    }   
    
    // 赋值操作
    L->data[index] = data;
    
    //更新操作
    L->len++;

    return 0;
}
// 尾删
Elenemt_data tail_del_list(Sql_list * L)
{
    Elenemt_data data;
    memset(&data , 0 , sizeof(Elenemt_data));
    // 1、安全判断
    if (NULL == L)
    {
        printf("表空间不存在\n");
        return data;
    }
    if (NULL == L->data)
    {
        printf("数据空间不存在\n");
        return data;
    }
    if ( 0 >= L->len )
    {
        printf("数据空间为空\n");
        return data;
    }
    // 删除
    L->len--;
    // 回传被删除的数据
    return L->data[L->len];
}

// 按位置删除
Elenemt_data pos_del_list(Sql_list * L , int index)
{
    Elenemt_data data;
    memset(&data , 0 , sizeof(Elenemt_data));
    // 1、安全判断
    if (NULL == L)
    {
        printf("表空间不存在\n");
        return data;
    }
    if (NULL == L->data)
    {
        printf("数据空间不存在\n");
        return data;
    }
    if ( 0 >= L->len )
    {
        printf("数据空间为空\n");
        return data;
    }
    if (index >= L->len || index < 0)
    {
        printf("index 参数错误\n");
        return data;
    }
    // 循环移动
    data = L->data[index];
    for (int i = index ; i <  L->len ; i++)
    {
        L->data[i] = L->data[i + 1];
        // printf("开始移动L->data[%d] ->>  L->data[%d]\n" , i , i + 1);
    }
    // 更新迭代
    L->len--;
    // 返回被删除的数据
    return data;
}

// 通过名字查找 成功返回 下标  失败返回 EOF
int find_by_name(Sql_list * L)
{
    // 1、安全判断
    if (NULL == L)
    {
        printf("表空间不存在\n");
        return EOF;
    }
    if (NULL == L->data)
    {
        printf("数据空间不存在\n");
        return EOF;
    }
    // 用户输入
    char name[20];
    printf("请输入你需要查询的名字: \t");
    scanf("%s" , name);
    // 遍历查询
    for (int i = 0; i < L->len; i++)
    {
        if (!strcmp( L->data[i].name , name )) // 开始比对
        {
            printf("找到了\n");
            return i;
        }
    }
    // 没找到 返回 -1
    printf("没找到\n");
    return EOF;
}


int find_by_id(Sql_list * L);


// //顺序表的遍历：
void printf_Sql_List(Sql_list * L)
{
    // 1、安全判断
    if (NULL == L)
    {
        printf("表空间不存在\n");
        return ;
    }
    if (NULL == L->data)
    {
        printf("数据空间不存在\n");
        return ;
    }
    if (0 >= L->len)
    {
        printf("表为空请写入数据后再进行遍历\n");
        return ;
    }
    for (int i = 0; i < L->len; i++)
    {
        printf("姓名 %s\t性别 %s\t年龄 %d\t学号 %d\t成绩 %d\n" , 
        L->data[i].name , 
        L->data[i].sex , 
        L->data[i].age , 
        L->data[i].id , 
        L->data[i].sco);
    }
    
}

// 顺序表的判空： 为空 返回 0  不为空返回 1
int IsEmpty_Sql_List(Sql_list * L)
{
    // 不为空
    if (L->len > 0)
    {
        return 1;
    }
    // 为空
    return 0;
}
// 顺序表的清空：
void Clear_Sql_List(Sql_list * L)
{
    L->len=0;
}

// 指针的销毁
void Destroy_Sql_List(Sql_list ** L)
{
    if (NULL == *L)
    {
        printf("这片空间不能存在\n");
    }
    // 释放数据空间
    free((*L)->data);
    (*L)->data = NULL;
    // 释放结构空间
    free(*L);
    *L = NULL;
}


